package cn.ddiancan.xddcloud.psc.flow.strategy;

import java.util.List;
import java.util.Objects;
import java.util.Optional;

import cn.ddiancan.xddcloud.psc.flow.utils.Assert;
import cn.ddiancan.xddcloud.psc.flow.engine.core.FlowCreator;
import cn.ddiancan.xddcloud.psc.flow.entity.XddTaskActor;

/**
 * 任务访问策略类
 * 用于判断给定的创建人员是否允许执行某个任务
 * @since 1.0
 */
public interface TaskAccessStrategy {

    /**
     * 根据创建人ID、参与者集合判断是否允许访问所属任务
     *
     * @param userId     用户ID
     * @param taskActors 参与者列表
     * @return 被允许参与者 {@link XddTaskActor}
     */
    XddTaskActor isAllowed(String userId, List<XddTaskActor> taskActors);

    /**
     * 获取指定合法参与者对象
     * 被使用在：分配任务，解决委派任务 场景
     *
     * @param taskId      当前任务ID
     * @param taskActors  通过任务ID查询到的任务参与者列表
     * @param flowCreator 任务参与者
     * @return {@link XddTaskActor}
     */
    default XddTaskActor getAllowedXddTaskActor(Long taskId, FlowCreator flowCreator, List<XddTaskActor> taskActors) {
        Optional<XddTaskActor> taskActorOpt =
            taskActors.stream().filter(t -> Objects.equals(t.getActorId(), flowCreator.getCreateName())).findFirst();
        Assert.isTrue(!taskActorOpt.isPresent(), "Not authorized to perform this task");
        return taskActorOpt.get();
    }
}
